/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package model.estoque;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceException;
import javax.persistence.Query;
import model.dao.IRepositorioEstoque;
import model.daoimpl.GenericDAO;
import model.excecoes.ErroDAOException;
/**
 *
 * @author Marcos
 */
public class RepositorioEstoque extends GenericDAO<Estoque> implements IRepositorioEstoque{
    
    
    @Override
    public void cadastrar(Estoque objeto)throws ErroDAOException, PersistenceException{
        Query query = this.getManager().createQuery("Select e.quantidadeChegada From Estoque e JOIN FETCH e.produto Where e.produto.descricao = :descricao and e.produto.marca = :marca");
        query.setParameter("descricao", objeto.getProduto().getDescricao());
        query.setParameter("marca", objeto.getProduto().getMarca());
        int total = 0;
        total = objeto.getQuantidadeChegada() + query.getFirstResult();
        objeto.setQuantidadeChegada(total);
        super.cadastrar(objeto);
    }

    @Override
    public List<Estoque> listarEstoque(String consulta, String campo) throws ErroDAOException, PersistenceException, NoResultException {
        List<Estoque> estoques = null;
        Query query = null;
        
        try{
            if(consulta.equals("Todos") && campo.equals("Todos")){
                query = this.getManager().createQuery("Select e From Estoque e JOIN FETCH e.produto JOIN FETCH e.funcionario");
            }else{
                if(campo.equals("Código")){
                    query = this.getManager().createQuery("Select e From Estoque e JOIN FETCH e.produto JOIN FETCH e.funcionario Where e.id = :codigo");
                    query.setParameter("codigo", Integer.parseInt(consulta));
                }else{
                    if(campo.equals("Descrição do Produto")){
                        query = this.getManager().createQuery("Select e From Estoque e JOIN FETCH e.produto Where e.produto.descricao = :descricao");
                        query.setParameter("descricao", consulta);
                    }else{
                        if(campo.equals("Data de Chegada")){
                            query = this.getManager().createQuery("Select e From Estoque e JOIN FETCH e.produto JOIN FETCH e.funcionario Where e.dataEntrada = :dataEntrada");
                            SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
                            try {
                                query.setParameter("dataEntrada", format.parse(consulta));
                            } catch (ParseException ex) {
                                Logger.getLogger(RepositorioEstoque.class.getName()).log(Level.SEVERE, null, ex);
                            }
                            
                        }
                    }
                }
            }
        }catch(NoResultException ex){
            throw new ErroDAOException("Erro de Consulta.\nDetalhes Técnicos:\n" + ex.getMessage());
        }catch(PersistenceException ex){
            throw new ErroDAOException("Erro de Persistência.\nDetalhes Técnicos:\n" + ex.getMessage());
        }
        estoques = query.getResultList();
        return estoques;
    }

    @Override
    public int identificarCodigoProduto(String descricao, String marca) throws ErroDAOException, PersistenceException, NoResultException {
        int codigoProduto = 0;
        Query query = null;
        
        try{
            query = this.getManager().createQuery("Select p.codigo FROM Produto p Where p.descricao = :descricao and p.marca = :marca");
            query.setParameter("descricao", descricao);
            query.setParameter("marca", marca);
            if(query.getFirstResult() != 0){
                codigoProduto = query.getFirstResult();
            }
        }catch(NoResultException ex){
            throw new ErroDAOException("Erro de Consulta.\nDetalhes Técnicos:\n" + ex.getMessage());
        }catch(PersistenceException ex){
            throw new ErroDAOException("Erro de Persistência.\nDetalhes Técnicos:\n" + ex.getMessage());
        }
        
        return codigoProduto;
    }
    
}
